package cn.wen.yaling.xo.dao;

import cn.wen.yaling.commons.entity.ArticleEntity;
import cn.wen.yaling.commons.vo.*;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 
 * 
 * @author FY
 * @email 932043654@qq.com
 * @date 2022-08-13 02:07:37
 */
@Mapper
@Component
public interface ArticleDao extends BaseMapper<ArticleEntity> {

    /**
     * 获取推荐列表
     * @return
     */
    List<ArticleSimpleVO> getArticleRecommendList();

    /**
     * 获取全部激活的文章
     * @return
     */
    List<ArticleListVO> getArticleList();

    /**
     * 获取前8最热的文章
     * @return
     */
    List<ArticleSimpleVO> getArticleHottestList();

    /**
     * 传入限制数  获取最新的文章
     * @param limit
     * @return
     */
    List<ArticleSimpleVO> getArticleNewLimitNum(@Param("limit") Integer limit);

    /**
     * 通过文章Id获取文章的详情信息
     * @param articleId
     * @return
     */
    ArticleVO getArticleInfoById(@Param("articleId") Integer articleId);

    /**
     * 通过typeId 和 类型 和优先级获取文章列表
     * @param typeId
     * @return
     */
    List<ArticleVO> getArticleListByTypeId(@Param("typeId") Integer typeId);

    /**
     * 通过分类Id获取分类下所有的文章
     * @param typeId
     * @return
     */
    List<ArticleListVO> getTypeArticleList(@Param("typeId") Integer typeId);

    /**
     * 通过标签Id获取当前标签下的所有文章
     * @param tagId
     * @return
     */
    List<ArticleListVO> getTagArticleList(@Param("tagId") Integer tagId);

    /**
     * 通过标签Id获取热门文章推荐列表
     * @param tagId
     * @return
     */
    List<ArticleSimpleVO> getArticleHotListByTag(@Param("tagId") Integer tagId, @Param("limit") Integer limit);

    /**
     * 通过 类别Id获取热门文章推荐列表
     * @param typeId
     * @return
     */
    List<ArticleSimpleVO> getArticleHotListByType(@Param("typeId") Integer typeId, @Param("limit") Integer limit);

    /**
     * 通过年份获取全部分类
     * @return
     */
    List<String> findGroupByYear();

    /**
     * 通过年份获取当年内的所有数据  降序
     * @param year
     * @return
     */
    List<ArticleSimpleVO> findArticleByYear(@Param("year") String year);

    /**
     * 通过文章Id来更改文章的浏览量
     * @param articleViews
     * @param articleId
     */
    void updateArticleViewById(@Param("articleViews") Integer articleViews, @Param("articleId") Integer articleId);

    /**
     * 通过关键字查询文章列表
     * @param queryVO
     * @return
     */
    List<ArticleListVO> getArticleByKeyword(@Param("queryVO") QueryVO queryVO);

    /**
     * 插入用户与文章的关系表中
     * @param userId
     * @param articleId
     */
    void insertArticleAndUser(@Param("userId") String userId,@Param("articleId") Integer articleId);

    /**
     * 插入到文章和标签的关系表中
     * @param articleId
     * @param tagId
     */
    void insertArticleAndTags(@Param("articleId") Integer articleId, @Param("tagIds") Integer[] tagId);

    /**
     * 添加文章和类型的关系表中
     * @param articleId
     * @param typeId
     */
    void insertArticleAndType(@Param("articleId") Integer articleId, @Param("typeId") Integer typeId);

    /**
     * 修改文章发布状态
     * @param articleId
     * @param isPublish
     * @param status
     * @return
     */
    boolean updateArticlePublishStatusById(@Param("articleId") Integer articleId,
                                           @Param("isPublish") Boolean isPublish,
                                           @Param("status") int status);

    /**
     * 通过文章Id 更新文章类型
     * @param articleId
     * @param typeId
     * @return
     */
    boolean updateArticleTypeById(@Param("articleId") Integer articleId, @Param("typeId") Integer typeId);

    /**
     * 通过文章Id 获取全部的标签列表
     * @param articleId
     * @return
     */
    List<Integer> getArticleTagsByArticleId(@Param("articleId") Integer articleId);

    /**
     * 通过文章Id 删除全部的标签Id
     * @param articleId
     * @return
     */
    boolean deleteTagsById(@Param("articleId") Integer articleId);


    /**
     * 批量修改文章状态
     * @param articleIds
     * @param status
     * @return
     */
    boolean updateByIds(@Param("articleIds") Integer[] articleIds, @Param("status") int status);

    /**
     * 获取一年内的文章贡献数
     *
     * @param startTime
     * @param endTime
     * @return
     */
    List<ArticleTypeVO> getBlogContributeCount(@Param("startTime") String startTime, @Param("endTime") String endTime);

    /**
     * 模糊查询
     * @param query
     * @param userId
     * @return
     */
    List<ArticleVO> getArticleListSearch(@Param("query") ArticleQueryVO query, @Param("userId") String userId);

    /**
     * 通过文章Id列表获取分类列表
     * @param articleIds
     * @param type
     * @return
     */
    List<Integer> selectTypeListByArticleId(@Param("articleIds") Integer[] articleIds,@Param("type") int type);

    /**
     * 通过专题Id 获取所有的分类
     * @param subjectId
     * @return
     */
    List<Integer> getTypeListBySubjectId(@Param("subjectId") Integer subjectId);

    /**
     * 获取文章Id列表
     * @param subjectId
     * @return
     */
    List<Integer> getArticleIdsBySubjectId(@Param("subjectId") Integer subjectId);

    /**
     * 存入到分类中
     * @param articleIds
     * @param subjectId
     * @return
     */
    boolean saveArticleIdsAndSubjectId(@Param("articleIds") Integer[] articleIds, @Param("subjectId") Integer subjectId);

    /**
     * 校验专栏中是否存在该文章
     * @param articleId
     * @param subjectId
     * @return
     */
    Boolean checkArticleFromSubject(@Param("articleId") Integer articleId, @Param("subjectId") Integer subjectId);

    /**
     * 将指定文章从专题中移除
     * @param articleId
     * @param subjectId
     * @return
     */
    boolean deleteArticleIdAndSubjectId(@Param("articleId") Integer articleId,
                                        @Param("subjectId") Integer subjectId);

    /**
     * 通过recommendId批量更新优先级
     * @param recommendList
     * @return
     */
    boolean updateArticleRecommend(@Param("recommendList") List<ArticleRecommendVO> recommendList);

    /**
     * 获取专栏列表中基本信息的文章列表
     * @param typeId
     * @return
     */
    List<ArticleAdminVO> getSimpleArticleListByTypeId(@Param("typeId") Integer typeId);

    /**
     * 批量修改文章的优先级
     * @param articlePriorityList
     * @return
     */
    boolean updateArticlePriority(@Param("articlePriorityList") List<ArticlePriorityVO> articlePriorityList);


    /**
     * 获取未被删除的文章列表
     * @param status
     * @param userId
     * @return
     */
    List<ArticleVO> getArticleListByNoStatus(@Param("status") Integer status, @Param("userId") String userId);

    /**
     * 通过等级获取文章推荐列表
     * @param level
     * @return
     */
    List<RecommendArticleVO> getRecommendListByLevel(@Param("level") Integer level);

    /**
     * 批量修改推荐等级中的数据
     * @param list
     * @return
     */
    boolean updateRecommendArticle(@Param("list") List<RecommendArticleVO> list);

    /**
     * 删除关系
     * @param articleId
     */
    void deleteArticleTypeRelationByArticleId(@Param("articleId") Integer articleId);

    /**
     * 判断是否存在重复的数据
     *
     * @param articleIds
     * @return
     */
    boolean checkArticleInSubject(@Param("articleIds")Integer[] articleIds);

    /**
     * 删除文章关系表
     *
     * @param articleIds
     */
    void deleteArticleTypeRelationByArticleIds(@Param("articleIds")Integer[] articleIds);

    /**
     * 修改文章分类信息
     *
     * @param articleIds
     * @return
     */
    boolean updateArticleIdsAndSubjectId(@Param("articleIds")Integer[] articleIds);
}
